
/// 自定义一个结构
// pub enum RcList {
//     Cons(i32, Box<RcList>),
//     Nil,
// }

use std::rc::Rc;
use RcList::{Cons, Nil};

pub enum RcList {
    Cons(i32, Rc<RcList>),
    Nil,
}

/// 尝试一个使用 rc 的小例子
pub fn tail_rc_example() {
    println!("这是一个测试 Rc 智能指针的小例子。");
    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
    println!("Rc创建后的计数值：a = {}", Rc::strong_count(&a));
    // 如果继续使用 Rc::clone(&a)
    let b = Cons(3, Rc::clone(&a));
    println!("Rc创建后的计数值：b = {}", Rc::strong_count(&a));
    // 创建一个作用域
    {
        let c = Cons(4, Rc::clone(&a));
        println!("Rc创建后的计数值：c = {}", Rc::strong_count(&a));
        // 这个作用域离开后，Rc的引用值就会自动减一。
    }
    println!("当c离开作用域之后的计数引用值：c = {}", Rc::strong_count(&a));
}

#[test]
fn test_rc () {
    let name = Rc::new(String::from("Hello world."));
    assert_eq!(1, Rc::strong_count(&name));
    // 创建一个 rc 指针
    let rc1 = Rc::clone(&name);
    assert_eq!(name, rc1, "新增引用clone");
    assert_eq!(2, Rc::strong_count(&name), "");
    {
        // 创建一个作用域
        let rc2 = Rc::clone(&name);
        assert_eq!(name, rc2, "新增引用clone");
        assert_eq!(3, Rc::strong_count(&name), "");
    }
    // 作用域外，strong_count - 1
    assert_eq!(2, Rc::strong_count(&name), "");
}